#ifndef TOKENS_
#define TOKENS_

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>


enum LEX_STATE {START, INT, FLOAT, IDENT, OP, STRING, INVALID, COMMENTLINE};

enum Token {
	TOKEN_INT = 0,
	TOKEN_FLOAT = 1,
	TOKEN_STRING = 2,
	TOKEN_IDENT = 3,
	TOKEN_OP,
	TOKEN_KEYWORD,
	TOKEN_K_VAR,
	TOKEN_K_TRUE,
	TOKEN_K_FALSE,
	TOKEN_K_WHILE,
	TOKEN_K_IF,
	TOKEN_K_ELSE,
	TOKEN_K_FOR,
	TOKEN_K_BREAK,
	TOKEN_K_CONTINUE,
	TOKEN_K_FUNC, 
	TOKEN_K_RETURN,
	TOKEN_K_NONE,
	
	TOKEN_OP_DOT,
	TOKEN_OP_COMMA,
	TOKEN_OP_LPARA,
	TOKEN_OP_RPARA,
	TOKEN_OP_SEMICOLON,
	TOKEN_OP_LBRACKET,
	TOKEN_OP_RBRACKET,
	TOKEN_OP_LBRACE,
	TOKEN_OP_RBRACE,

	TOKEN_AM_MUL,
	TOKEN_AM_ADD,
	TOKEN_AM_SUB,	
	TOKEN_AM_DIV,
	TOKEN_AM_MOD,
	TOKEN_AM_XOR,
	TOKEN_BW_AND,
	TOKEN_BW_OR,
	TOKEN_UO_NOT,
	TOKEN_UO_SUB,
	TOKEN_LG_LESS,
	TOKEN_LG_GREAT,
	TOKEN_AS_MUL,
	TOKEN_AM_INC,
	TOKEN_AS_ADD,
	TOKEN_AM_DEC,
	TOKEN_AS_SUB,
	TOKEN_AS_DIV,
	TOKEN_AS_MOD,
	TOKEN_AS_XOR,
	TOKEN_LG_AND,
	TOKEN_AS_AND,
	TOKEN_LG_OR,
	TOKEN_AS_OR,
	TOKEN_LG_NOT,
	TOKEN_BW_LSH,
	TOKEN_LG_LESSEQ,
	TOKEN_BW_RSH,
	TOKEN_LG_CREATEQ,
	TOKEN_AS_LSH,
	TOKEN_AS_RSH,
	TOKEN_LG_EQ,
	TOKEN_AS_AS,
	
	TOKEN_OP_NUMBER,
	TOKEN_COMMENTLINE,
	TOKEN_INVALID,
	TOKEN_NONE,
	TOKEN_END_OF_STREAM, 
};

extern const char *getTokenName(Token token);

#endif
